package com.nchu.commondevelopmentframework.common.storage;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;

/**
 * @InterfaceName: StorageStrategy
 * @description: 存储策略接口
 * @author: Li Chuanwei
 * @date: 2024/01/21 13:33
 **/
public interface StorageStrategy {
    /**
     * 创建文件夹或目录
     *
     * @param directoryName 目录路径
     * @return true:成功 false:失败
     */
    boolean createDirectory(String directoryName);

    /**
     * 判断文件是否存在
     *
     * @param objectName 对象
     * @return 存在返回true，不存在发生异常返回false
     */
    boolean objectExist(String objectName);

    /**
     * 判断文件夹是否存在【注意是文件夹而不是目录】
     * @param folderName 文件夹名称（去掉前后的/）
     * @return 存在返回true，不存在发生异常返回false
     */
    boolean folderExist(String folderName);

    /**
     * 文件上传
     * @param multipartFile 待上传文件
     * @param folderName 目录
     * @param aimFileName 最终保存到存储中的文件名，不需要后缀
     * @return 返回上传成功后的文件的url
     */
    String uploadFileAndGetURL(MultipartFile multipartFile, String folderName, String aimFileName);

    /**
     * 上传文件【不指定文件夹】
     * @param multipartFile 待上传文件
     * @param fileName 最终保存到存储中的文件名，不需要后缀
     * @return 返回上传成功后的文件的url
     */
    String uploadFileAndGetURL(MultipartFile multipartFile, String fileName);

    /**
     * 上传文件【不指定文件夹,不指定目标文件名】
     * @param multipartFile 待上传文件
     * @return 返回上传成功后的文件的url
     */
    String uploadFileAndGetURL(MultipartFile multipartFile);

    /**
     * 拷贝文件
     *
     * @param destinationBucketName 目标bucket名称
     * @param destinationKey 目标文件名称
     * @param sourceKey    文件名称（包括目录）
     * @return 成功返回true，失败发生异常返回false
     */
    boolean copyObject(String destinationBucketName, String destinationKey, String sourceKey);

    /**
     * 文件下载
     * @param fileName 文件名称
     * @param response response
     * @return 成功返回true，失败发生异常返回false
     */
    boolean getObject(String fileName, HttpServletResponse response);

    /**
     * 获取指定路径下的所有文件对象
     * @param keyPrefix 文件名称
     * @return 存储bucket内指定路径下文件对象信息
     */
    List<String> getBucketObjects(String keyPrefix);

    /**
     * 删除文件
     * @param fileName 文件名
     * @return 成功返回true，失败发生异常返回false
     */
    boolean removeObject(String fileName);
}